import java.util.HashMap;
import java.util.Map;

public class Leet525 {
    public static void main(String[] args) {
        Leet525 l = new Leet525();
        System.out.println(l.findMaxLength(new int[]{1,1,0,1,0,1,0}));
    }
    public int findMaxLength(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        int count = 0;
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i]==0)
                count--;
            else count++;
            if (map.containsKey(count)){
                max = Math.max(max,i-map.get(count));
            }else map.put(count,i);
            if (count==0)
                max = Math.max(max,i+1);
        }
        return max;
    }
//    public int findMaxLength(int[] nums) {
//        Map<Integer,int[]> l = new HashMap<>();
//        Map<Integer,int[]> r = new HashMap<>();
//        int len = nums.length;
//        if (nums[0] == 1){
//            l.put(0,new int[]{0,1});
//        }else l.put(0,new int[]{1,0});
//        for (int i = 1; i < len; i++) {
//            int[] te = new int[]{l.get(i-1)[0],l.get(i-1)[1]};
//            te[nums[i]]++;
//            l.put(i,te);
//        }
//        int max = 0;
//        for (int i = 0; i < len; i++) {
//            for (int j = i+1; j < len; j++) {
//                if (l.get(j)[0]-l.get(i)[0]==l.get(j)[1]-l.get(i)[1]){
//                    max = Math.max(l.get(j)[0]-l.get(i)[0],max);
//                }
//            }
//        }
//        for (int i = 0; i < len; i++) {
//            if (l.get(i)[0]==l.get(i)[1])
//                max = Math.max(l.get(i)[0],max);
//        }
//
////        if (nums[len-1] == 1){
////            r.put(len-1,new int[]{0,1});
////        }else r.put(len-1,new int[]{1,0});
////        for (int i = len-2; i >= 0; i--) {
////            int[] te = new int[]{r.get(i+1)[0],r.get(i+1)[1]};
////            te[nums[i]]++;
////            r.put(i,te);
////        }
//        return max*2;
//    }
}
